import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getTokenTime } from '@/utils/auth.js'
import router from '@/router'

const timeOut = 2 * 60 * 60 * 1000
// const timeOut = 5 * 1000
// create an axios instance
const require = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // request timeout
})

// 请求拦截
require.interceptors.request.use((config) => {
  if (store.state.user.token) {
    // 主动处理
    if (isTimeOut()) {
      // 过期
      // 请求拦截的promise错误可以进入响应拦截的err
      // 执行退出
      store.commit('user/logout')
      router.push('/login')
      return Promise.reject(new Error('登录过期'))
    }
    config.headers.Authorization = store.state.user.token
  }
  return config
}

)
// 响应拦截
require.interceptors.response.use(
  (res) => {
    const { data, meta } = res.data
    // const status = [200, 201, 204]
    // const msg = ['请求成功', '创建成功', '删除成功', '登录成功']
    if (meta && meta.status === 200 || meta.status === 201) {
      return data
    } else {
      // 业务失败
      // 业务失败 若不用promise.rejiect就没办法获取错误 那就会走成功的代码  (newError 获取制造的错误)
      Message.error(meta.msg)

      return Promise.reject(new Error(meta))
    }
  }, (err) => {
    Message.error(err.message)
    return Promise.reject(err)
  }
)

// 封装token的方法函数
function isTimeOut() {
  const currentTime = Date.now()
  const tokenTime = getTokenTime()
  const time = currentTime - tokenTime
  // 如果当前时间-本地时间 >约定时间 表示过期

  return time >= timeOut
}

export default require
